import requests
import base64
import os
from pathlib import Path
from .config import config_manager

class GeminiEngine:
    def __init__(self, key_id=None, model=None, temperature=None, top_p=None):
        # 获取gemini配置
        config = config_manager.get_config()
        gemini_config = config.get("gemini", {})
        
        self.api_key = gemini_config["api_key"]
        self.base_url = gemini_config["base_url"]
        self.model = model or gemini_config["model"]
        self.max_tokens = gemini_config.get("max_tokens", 4000)
        self.temperature = temperature if temperature is not None else gemini_config.get("temperature", 0.7)
        self.top_p = top_p if top_p is not None else 0.9  # gemini默认top_p
        self.key_name = "Gemini"

    def generate_test_cases(self, content, title="测试用例", prompt_template=None):
        """生成测试用例"""
        
        # 构建系统指令和用户消息
        system_instruction = "你是一个专业的AI测试工程师，专门负责生成高质量的测试用例。"
        
        # Gemini API 使用不同的请求格式
        data = {
            "contents": [{
                "parts": [{
                    "text": content
                }]
            }],
            "systemInstruction": {
                "parts": [{
                    "text": system_instruction
                }]
            },
            "generationConfig": {
                "temperature": self.temperature,
                "maxOutputTokens": self.max_tokens,
                "topP": self.top_p
            }
        }
        
        try:
            print(f"【Gemini AI调用】模型: {self.model}, 温度: {self.temperature}, Top_p: {self.top_p}")
            # print("【Gemini AI调用】Prompt内容前500：", content[:500])
            
            # Gemini API URL格式：使用API key作为查询参数
            url = f"{self.base_url}/models/{self.model}:generateContent?key={self.api_key}"
            
            headers = {
                "Content-Type": "application/json"
            }
            
            # 打印完整的请求信息
            print(f"【Gemini AI调用】请求 URL: {url[:80]}...")  # 只打印前80个字符（隐藏完整API key）
            print(f"【Gemini AI调用】请求 Headers: {headers}")
            print(f"【Gemini AI调用】请求 Body: {data}")
            
            resp = requests.post(url, headers=headers, json=data, timeout=1800)
            print(f"【Gemini AI调用】响应状态码：{resp.status_code}")
            print(f"【Gemini AI调用】响应 Headers: {dict(resp.headers)}")
            print(f"【Gemini AI调用】响应 Body: {resp.text}")
            
            # 检查响应状态
            if resp.status_code == 400:
                try:
                    error_data = resp.json()
                    error_message = error_data.get("error", {}).get("message", "")
                    
                    # 检查是否是地理位置限制
                    if "location is not supported" in error_message.lower():
                        error_msg = (
                            "Gemini API 地理位置限制错误。\n\n"
                            "解决方案：\n"
                            "1. 使用代理或VPN连接到支持的地区（如美国、欧洲等）\n"
                            "2. 或使用其他AI模型（豆包、DeepSeek）"
                        )
                    else:
                        error_msg = f"Gemini API请求错误: {error_message}"
                except Exception:
                    error_msg = "Gemini API请求格式错误，请检查配置"
                
                print(f"【Gemini AI调用】{error_msg}")
                return {
                    "success": False,
                    "error": error_msg,
                    "raw_response": "",
                    "key_name": self.key_name
                }
            elif resp.status_code == 401 or resp.status_code == 403:
                error_msg = "Gemini API密钥无效，请检查config.yaml中的api_key配置"
                print(f"【Gemini AI调用】{error_msg}")
                return {
                    "success": False,
                    "error": error_msg,
                    "raw_response": "",
                    "key_name": self.key_name
                }
            elif resp.status_code == 429:
                error_msg = "Gemini API请求频率过高，请稍后重试"
                print(f"【Gemini AI调用】{error_msg}")
                return {
                    "success": False,
                    "error": error_msg,
                    "raw_response": "",
                    "key_name": self.key_name
                }
            
            resp.raise_for_status()
            
            result = resp.json()
            
            # Gemini API 响应格式
            if "candidates" in result and len(result["candidates"]) > 0:
                candidate = result["candidates"][0]
                if "content" in candidate and "parts" in candidate["content"]:
                    ai_content = candidate["content"]["parts"][0]["text"]
                    
                    return {
                        "success": True,
                        "raw_response": ai_content,
                        "file": "gemini_ai.txt",
                        "key_name": self.key_name
                    }
            
            # 如果响应格式不符合预期
            error_msg = "Gemini API返回格式异常"
            print(f"【Gemini AI调用】{error_msg}: {result}")
            return {
                "success": False,
                "error": error_msg,
                "raw_response": "",
                "key_name": self.key_name
            }
            
        except requests.exceptions.RequestException as e:
            error_msg = f"Gemini API调用失败: {str(e)}"
            print(f"【Gemini AI调用】{error_msg}")
            return {
                "success": False,
                "error": error_msg,
                "raw_response": "",
                "key_name": self.key_name
            }
        except Exception as e:
            error_msg = f"Gemini调用异常: {str(e)}"
            print(f"【Gemini AI调用】{error_msg}")
            return {
                "success": False,
                "error": error_msg,
                "raw_response": "",
                "key_name": self.key_name
            }

    def generate_code_analyse(self, content, title="代码分析", prompt_template=None):
        """生成代码质量分析"""
        
        # 构建系统指令和用户消息
        system_instruction = "你是一个专业的开发测试工程师（开发语言包括不限于golang、java、python），需要根据提示词内容中的代码识别到正确的开发语言，然后根据提示词完成对代码质量的分析。请使用简体中文回答。"
        
        # Gemini API 使用不同的请求格式
        data = {
            "contents": [{
                "parts": [{
                    "text": content
                }]
            }],
            "systemInstruction": {
                "parts": [{
                    "text": system_instruction
                }]
            },
            "generationConfig": {
                "temperature": self.temperature,
                "maxOutputTokens": self.max_tokens,
                "topP": self.top_p
            }
        }
        
        try:
            print(f"【Gemini AI调用-代码分析】模型: {self.model}, 温度: {self.temperature}, Top_p: {self.top_p}")
            # print(f"【Gemini AI调用-代码分析】Content参数内容：\n{content}")

            # Gemini API URL格式：使用API key作为查询参数
            url = f"{self.base_url}/models/{self.model}:generateContent?key={self.api_key}"
            
            headers = {
                "Content-Type": "application/json"
            }
            
            # 打印完整的请求信息
            print(f"【Gemini AI调用-代码分析】请求 URL: {url[:80]}...")  # 只打印前80个字符（隐藏完整API key）
            print(f"【Gemini AI调用-代码分析】请求 Headers: {headers}")
            print(f"【Gemini AI调用-代码分析】请求 Body: {data}")
            
            resp = requests.post(url, headers=headers, json=data, timeout=1800)
            print(f"【Gemini AI调用-代码分析】响应状态码：{resp.status_code}")
            print(f"【Gemini AI调用-代码分析】响应 Headers: {dict(resp.headers)}")
            print(f"【Gemini AI调用-代码分析】响应 Body: {resp.text}")
            
            # 检查响应状态
            if resp.status_code == 400:
                try:
                    error_data = resp.json()
                    error_message = error_data.get("error", {}).get("message", "")
                    
                    # 检查是否是地理位置限制
                    if "location is not supported" in error_message.lower():
                        error_msg = (
                            "Gemini API 地理位置限制错误。\n\n"
                            "解决方案：\n"
                            "1. 使用代理或VPN连接到支持的地区（如美国、欧洲等）\n"
                            "2. 或使用其他AI模型（豆包、DeepSeek）"
                        )
                    else:
                        error_msg = f"Gemini API请求错误: {error_message}"
                except Exception:
                    error_msg = "Gemini API请求格式错误，请检查配置"
                
                print(f"【Gemini AI调用-代码分析】{error_msg}")
                return {
                    "success": False,
                    "error": error_msg,
                    "raw_response": "",
                    "key_name": self.key_name
                }
            elif resp.status_code == 401 or resp.status_code == 403:
                error_msg = "Gemini API密钥无效，请检查config.yaml中的api_key配置"
                print(f"【Gemini AI调用-代码分析】{error_msg}")
                return {
                    "success": False,
                    "error": error_msg,
                    "raw_response": "",
                    "key_name": self.key_name
                }
            elif resp.status_code == 429:
                error_msg = "Gemini API请求频率过高，请稍后重试"
                print(f"【Gemini AI调用-代码分析】{error_msg}")
                return {
                    "success": False,
                    "error": error_msg,
                    "raw_response": "",
                    "key_name": self.key_name
                }
            
            resp.raise_for_status()
            
            result = resp.json()
            
            # Gemini API 响应格式
            if "candidates" in result and len(result["candidates"]) > 0:
                candidate = result["candidates"][0]
                if "content" in candidate and "parts" in candidate["content"]:
                    ai_content = candidate["content"]["parts"][0]["text"]
                    
                    return {
                        "success": True,
                        "raw_response": ai_content,
                        "file": "gemini_ai.txt",
                        "key_name": self.key_name
                    }
            
            # 如果响应格式不符合预期
            error_msg = "Gemini API返回格式异常"
            print(f"【Gemini AI调用-代码分析】{error_msg}: {result}")
            return {
                "success": False,
                "error": error_msg,
                "raw_response": "",
                "key_name": self.key_name
            }
            
        except requests.exceptions.RequestException as e:
            error_msg = f"Gemini API调用失败: {str(e)}"
            print(f"【Gemini AI调用-代码分析】{error_msg}")
            return {
                "success": False,
                "error": error_msg,
                "raw_response": "",
                "key_name": self.key_name
            }
        except Exception as e:
            error_msg = f"Gemini调用异常: {str(e)}"
            print(f"【Gemini AI调用-代码分析】{error_msg}")
            return {
                "success": False,
                "error": error_msg,
                "raw_response": "",
                "key_name": self.key_name
            }


